﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using ABC_SA_DM;

namespace ABC_SA_DAL
{
    public class Servicios_DAL
    {
        //******************Procedimientos almacenados******************//

        //recibe un objeto servicio y lo ingresa a la base de datos
        public bool Crear(Servicio s) {
            Conexion conecta = new Conexion();
            SqlConnection conn = conecta.Conectar();

            try {
                SqlCommand cmd = new SqlCommand();
                cmd.CommandText = "InsertaServicio";
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Connection = conn;

                SqlParameter spNombre = new SqlParameter();
                spNombre.ParameterName = "@nombre";
                spNombre.Value = s.Nombre;
                spNombre.Direction = System.Data.ParameterDirection.Input;
                spNombre.DbType = System.Data.DbType.String;

                SqlParameter spMonto = new SqlParameter();
                spMonto.ParameterName = "@monto";
                spMonto.Value = s.Monto;
                spMonto.Direction = System.Data.ParameterDirection.Input;
                spMonto.DbType = System.Data.DbType.Double;

                SqlParameter spCategoria = new SqlParameter();
                spCategoria.ParameterName = "@categoria";
                spCategoria.Value = s.Categoria;
                spCategoria.Direction = System.Data.ParameterDirection.Input;
                spCategoria.DbType = System.Data.DbType.Int32;

                cmd.Parameters.Add(spNombre);
                cmd.Parameters.Add(spMonto);
                cmd.Parameters.Add(spCategoria);

                cmd.ExecuteNonQuery();

                conn.Close();
                return true;
            }
            catch (Exception e)
            {
                conn.Close();
                return false;
            }
        }

        //Modifica la base de datos usando como llave el servicio_id
        public bool ModificarServicio(Servicio s)
        {
            Conexion conecta = new Conexion();
            SqlConnection conn = conecta.Conectar();

            try
            {
                SqlCommand cmd = new SqlCommand();
                cmd.CommandText = "InsertaServicio";
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Connection = conn;

                SqlParameter spId = new SqlParameter();
                spId.ParameterName = "@id_servicio";
                spId.Value = s.IdServicio;
                spId.Direction = System.Data.ParameterDirection.Input;
                spId.DbType = System.Data.DbType.Int32;

                SqlParameter spNombre = new SqlParameter();
                spNombre.ParameterName = "@nombre";
                spNombre.Value = s.Nombre;
                spNombre.Direction = System.Data.ParameterDirection.Input;
                spNombre.DbType = System.Data.DbType.String;

                SqlParameter spMonto = new SqlParameter();
                spMonto.ParameterName = "@monto";
                spMonto.Value = s.Monto;
                spMonto.Direction = System.Data.ParameterDirection.Input;
                spMonto.DbType = System.Data.DbType.Double;

                SqlParameter spCategoria = new SqlParameter();
                spCategoria.ParameterName = "@categoria";
                spCategoria.Value = s.Categoria;
                spCategoria.Direction = System.Data.ParameterDirection.Input;
                spCategoria.DbType = System.Data.DbType.Int32;

                cmd.Parameters.Add(spId);
                cmd.Parameters.Add(spNombre);
                cmd.Parameters.Add(spMonto);
                cmd.Parameters.Add(spCategoria);

                cmd.ExecuteNonQuery();

                conn.Close();
                return true;
            }
            catch (Exception e)
            {
                conn.Close();
                return false;
            }
        }

        //se elimina un servicio mediante el uso del primary key
        public bool eliminarServicio(Int32 id) {
            Conexion conecta = new Conexion();
            SqlConnection conn = conecta.Conectar();

            try {
                SqlCommand cmd = new SqlCommand();
                cmd.CommandText = "EliminaServicio";
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Connection = conn;

                SqlParameter spElimina = new SqlParameter();
                spElimina.ParameterName = "@id_servicio";
                spElimina.Value = id;
                spElimina.Direction = System.Data.ParameterDirection.Input;
                spElimina.DbType = System.Data.DbType.Int32;

                cmd.Parameters.Add(spElimina);

                cmd.ExecuteNonQuery();

                conn.Close();
                return true;
            }
            catch (Exception e)
            {
                conn.Close();
                return false;
            }
        }

        public void eliminarProvedorServicio(Int32 id){
            Conexion conecta = new Conexion();
            SqlConnection conn = conecta.Conectar();

            try
            {
                SqlCommand cmd = new SqlCommand();
                cmd.CommandText = "EliminaProvedorServicio";
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Connection = conn;

                SqlParameter spElimina = new SqlParameter();
                spElimina.ParameterName = "@id_servicio";
                spElimina.Value = id;
                spElimina.Direction = System.Data.ParameterDirection.Input;
                spElimina.DbType = System.Data.DbType.Int32;

                cmd.Parameters.Add(spElimina);

                cmd.ExecuteNonQuery();

                conn.Close();
            }
            catch (Exception e)
            {
                conn.Close();
            }
        }

        public void eliminarExtraServicio(Int32 id)
        {
            Conexion conecta = new Conexion();
            SqlConnection conn = conecta.Conectar();

            try
            {
                SqlCommand cmd = new SqlCommand();
                cmd.CommandText = "EliminaExtraServicio";
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Connection = conn;

                SqlParameter spElimina = new SqlParameter();
                spElimina.ParameterName = "@id_servicio";
                spElimina.Value = id;
                spElimina.Direction = System.Data.ParameterDirection.Input;
                spElimina.DbType = System.Data.DbType.Int32;

                cmd.Parameters.Add(spElimina);

                cmd.ExecuteNonQuery();

                conn.Close();
            }
            catch (Exception e)
            {
                conn.Close();
            }
        }

        public void eliminarPaqueteServicio(Int32 id)
        {
            Conexion conecta = new Conexion();
            SqlConnection conn = conecta.Conectar();

            try
            {
                SqlCommand cmd = new SqlCommand();
                cmd.CommandText = "EliminaPaqueteServicio";
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Connection = conn;

                SqlParameter spElimina = new SqlParameter();
                spElimina.ParameterName = "@id_servicio";
                spElimina.Value = id;
                spElimina.Direction = System.Data.ParameterDirection.Input;
                spElimina.DbType = System.Data.DbType.Int32;

                cmd.Parameters.Add(spElimina);

                cmd.ExecuteNonQuery();

                conn.Close();
            }
            catch (Exception e)
            {
                conn.Close();
            }
        }

        public List<ProveedorServicio> consultarProveedorServicio() {
            List<ProveedorServicio> lista = new List<ProveedorServicio>();
            Conexion conecta = new Conexion();
            SqlConnection conn = conecta.Conectar();

            try
            {
                SqlCommand cmd = new SqlCommand();
                cmd.CommandText = "ConsultarProveedorServicio";
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Connection = conn;

                SqlDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    ProveedorServicio provServ = new ProveedorServicio();
                    provServ.IdProveedor = Convert.ToInt32(reader.GetValue(0));
                    provServ.IdServicio = Convert.ToInt32(reader.GetValue(1));

                    lista.Add(provServ);
                }

                conn.Close();
                return lista;
            }
            catch (Exception e) 
            {
                lista = null;
                conn.Close();
                return lista;
            }
        }

        public List<Servicio> consProvServ(List<ProveedorServicio> listaPS, int idProveedor)
        {
            List<Servicio> lista = new List<Servicio>();
            Conexion conecta = new Conexion();
            SqlConnection conn = conecta.Conectar();

            try
            {
                for (int i = 0; i < listaPS.Count; i++)
                {
                    if (idProveedor == listaPS.ElementAt(i).IdProveedor)
                    {
                        SqlCommand cmd = new SqlCommand();
                        cmd.CommandText = "ConsultarProveedorServicio";
                        cmd.CommandType = System.Data.CommandType.StoredProcedure;
                        cmd.Connection = conn;

                        SqlParameter spConsulta = new SqlParameter();
                        spConsulta.ParameterName = "@id_servicio";
                        spConsulta.Value = listaPS.ElementAt(i).IdServicio;
                        spConsulta.Direction = System.Data.ParameterDirection.Input;
                        spConsulta.DbType = System.Data.DbType.Int32;

                        cmd.Parameters.Add(spConsulta);

                        SqlDataReader reader = cmd.ExecuteReader();

                        while (reader.Read())
                        {
                            Servicio serv = new Servicio();
                            serv.IdServicio = Convert.ToInt32(reader.GetValue(0));
                            serv.Nombre = Convert.ToString(reader.GetValue(1));
                            serv.Monto = Convert.ToDouble(reader.GetValue(2));
                            serv.Categoria = Convert.ToInt32(reader.GetValue(3));

                            lista.Add(serv);
                        }

                        reader.Close();                        
                    }
                }

                conn.Close();
                return lista;
            }
            catch (Exception e)
            {
                lista = null;
                conn.Close();
                return lista;
            }
        }

        //realiza una consulta a la base de datos de todos los servicios en la tabla servicios y los devuelve en una lista
        public List<Servicio> ConsultaServicios(){
            List<Servicio> lista = new List<Servicio>();
            Conexion conecta = new Conexion();
            SqlConnection conn = conecta.Conectar();

            try
            {
                SqlCommand cmd = new SqlCommand();
                cmd.CommandText = "ConsultarServicio";
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Connection = conn;

                SqlDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    Servicio serv = new Servicio();
                    serv.IdServicio = Convert.ToInt32(reader.GetValue(0));
                    serv.Nombre = Convert.ToString(reader.GetValue(1));
                    serv.Monto = Convert.ToDouble(reader.GetValue(2));
                    serv.Categoria = Convert.ToInt32(reader.GetValue(3));

                    lista.Add(serv);
                }

                conn.Close();
                return lista;
            }
            catch (Exception e) 
            {
                lista = null;
                conn.Close();
                return lista;
            }
        }

        //Se consulta un servicio en la BD
        public Servicio consultaIdServicio(int idServicio) {
            Servicio serv = new Servicio();
            Conexion conecta = new Conexion();
            SqlConnection conn = conecta.Conectar();

            try
            {
                SqlCommand cmd = new SqlCommand();
                cmd.CommandText = "ConsultarServicio";
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Connection = conn;

                SqlParameter spConsulta = new SqlParameter();
                spConsulta.ParameterName = "@id_servicio";
                spConsulta.Value = idServicio;
                spConsulta.Direction = System.Data.ParameterDirection.Input;
                spConsulta.DbType = System.Data.DbType.Int32;

                cmd.Parameters.Add(spConsulta);

                SqlDataReader reader = cmd.ExecuteReader();

                while (reader.Read()) {
                    serv.IdServicio = Convert.ToInt32(reader.GetValue(0));
                    serv.Nombre = Convert.ToString(reader.GetValue(1));
                    serv.Monto = Convert.ToInt32(reader.GetValue(2));
                    serv.Categoria = Convert.ToInt32(reader.GetValue(3));
                }

                conn.Close();
                return serv;
            }
            catch (Exception e) {
                serv = null;
                conn.Close();
                return serv;
            }
        }

        public bool relProveedorServicio(int idProveedor, List<string> Servicios) { 
            Servicio serv = new Servicio();
            Conexion conecta = new Conexion();
            SqlConnection conn = conecta.Conectar();

            try
            {
                for (int i = 0; i < Servicios.Count; i++)
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.CommandText = "ProveedorServicio";
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.Connection = conn;

                    Paquete_DAL consulta = new Paquete_DAL();

                    SqlParameter spIdProveedor = new SqlParameter();
                    spIdProveedor.ParameterName = "@id_proveedor";
                    spIdProveedor.Value = idProveedor;
                    spIdProveedor.Direction = System.Data.ParameterDirection.Input;
                    spIdProveedor.DbType = System.Data.DbType.Int32;

                    SqlParameter spIdServicio = new SqlParameter();
                    spIdServicio.ParameterName = "@id_servicio";
                    spIdServicio.Value = consulta.consultasConNombre(Servicios.ElementAt(i), 0);
                    spIdServicio.Direction = System.Data.ParameterDirection.Input;
                    spIdServicio.DbType = System.Data.DbType.Int32;

                    cmd.Parameters.Add(spIdProveedor);
                    cmd.Parameters.Add(spIdServicio);

                    cmd.ExecuteNonQuery();
                }

                conn.Close();
                return true;
            }
            catch (Exception e) {
                conn.Close();
                return false;
            }
        }
    }
}